package com.kinyx.framework.db.daos;

import java.util.List;

import com.kinyx.framework.db.sentence.str.SQLBatch;
import com.kinyx.framework.enums.impl.ErrorCode1;
import com.kinyx.framework.exception.KRuntimeException;

/**
 * 数据访问定义接口（SQL更新语句（批量））
 */
public interface _Dao_SQL_batchChange extends __Dao {

	/**
	 * INSERT/UPDATE/DELETE
	 * @param dp 数据访问参数
	 * @return 影响的数据行数
	 * @deprecated 用于框架实现类做统一实现，不对外提供使用。
	 */
	@Deprecated
	int batchChange(DaoParam dp);

	/**
	 * INSERT（批量）
	 * @param dp 数据访问参数
	 * @param sql INSERT语句
	 * @param listParams 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #batchInsert(DaoParam, SQLBatch)}
	 */
	@Deprecated
	default int batchInsert(final DaoParam dp, final String sql, final List<List<Object>> listParams) {
		if (!sql.startsWith("INSERT")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "INSERT").param("SQL", sql); }
		return this.batchChange(DaoParam.of(dp, DMLType.batchInsert).sql(sql).listParams(listParams));
	}
	/**
	 * UPDATE（批量）
	 * @param dp 数据访问参数
	 * @param sql UPDATE语句
	 * @param listParams 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #batchUpdate(DaoParam, SQLBatch)}
	 */
	@Deprecated
	default int batchUpdate(final DaoParam dp, final String sql, final List<List<Object>> listParams) {
		if (!sql.startsWith("UPDATE")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "UPDATE").param("SQL", sql); }
		return this.batchChange(DaoParam.of(dp, DMLType.batchUpdate).sql(sql).listParams(listParams));
	}
	/**
	 * DELETE（批量）
	 * @param dp 数据访问参数
	 * @param sql DELETE语句
	 * @param listParams 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #batchDelete(DaoParam, SQLBatch)}
	 */
	@Deprecated
	default int batchDelete(final DaoParam dp, final String sql, final List<List<Object>> listParams) {
		if (!sql.startsWith("DELETE")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "DELETE").param("SQL", sql); }
		return this.batchChange(DaoParam.of(dp, DMLType.batchDelete).sql(sql).listParams(listParams));
	}

	/**
	 * INSERT（批量）
	 * @param dp 数据访问参数
	 * @param sql INSERT语句
	 * @return 影响的数据行数
	 */
	default int batchInsert(final DaoParam dp, final SQLBatch sql) { return this.batchInsert(dp, sql.getSentence(), sql.getListParams()); }
	/**
	 * UPDATE（批量）
	 * @param dp 数据访问参数
	 * @param sql UPDATE语句
	 * @return 影响的数据行数
	 */
	default int batchUpdate(final DaoParam dp, final SQLBatch sql) { return this.batchUpdate(dp, sql.getSentence(), sql.getListParams()); }
	/**
	 * DELETE（批量）
	 * @param dp 数据访问参数
	 * @param sql DELETE语句
	 * @return 影响的数据行数
	 */
	default int batchDelete(final DaoParam dp, final SQLBatch sql) { return this.batchDelete(dp, sql.getSentence(), sql.getListParams()); }

}
